package moduloIndexacion.frames;

import entidades.Extension;

import java.awt.BorderLayout;
import java.awt.EventQueue;

import javassist.bytecode.Descriptor.Iterator;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.filechooser.FileFilter;
import javax.swing.filechooser.FileNameExtensionFilter;
import javax.swing.JButton;
import javax.swing.GroupLayout;
import javax.swing.GroupLayout.Alignment;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
import javax.swing.SwingConstants;
import java.awt.Component;
import javax.swing.JLabel;
import javax.swing.JTextField;
import java.awt.GridLayout;
import javax.swing.LayoutStyle.ComponentPlacement;

import moduloIndexacion.gestores.GestorIndexacion;

import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.io.File;
import java.util.ArrayList;
import java.util.regex.Pattern;
import java.awt.Toolkit;

public class FrameDocumento extends JFrame {

	private JPanel contentPane;
	private GestorIndexacion gestor;
	private ArrayList<File> documentos;
	private final JTextField txtDirecc;
	private final JLabel lblArchivosSeleccionados;
	
	/**
	 * Create the frame.
	 */
	public FrameDocumento( GestorIndexacion gestor ) {
		setResizable(false);
		setIconImage(Toolkit.getDefaultToolkit().getImage(FrameDocumento.class.getResource("/resources/ChewieIcon.jpg")));
		this.gestor = gestor;
		documentos = new ArrayList<File>();
		txtDirecc = new JTextField();
		lblArchivosSeleccionados = new JLabel("Archivos Seleccionados: ");
		initialize();
		if(gestor.getFiles().size() > 0){
			documentos = gestor.getFiles();
			txtDirecc.setText(documentos.get(0).toString());
			lblArchivosSeleccionados.setText("Archivos Seleccionados: "+documentos.size());
		}
	}
	
	public void initialize( ){
		setTitle("Chewie - Motor de Busqueda de Informaci\u00F3n");
		setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		setBounds(100, 100, 580, 340);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		contentPane.setLayout(new BorderLayout(0, 0));
		setContentPane(contentPane);
		
		JPanel panelMedio = new JPanel();
		contentPane.add(panelMedio, BorderLayout.CENTER);
		
		txtDirecc.setText("Ruta Archivo Seleccionado");
		txtDirecc.setColumns(10);
		
		final JFileChooser fileChooser= new JFileChooser();
		Extension[] arrayExt  = null;
		arrayExt = gestor.getExtensionesSelecc();
		for(int i =0; i < arrayExt.length; i++){
			Extension ex = arrayExt[i];
			if (! fileChooser.getChoosableFileFilters().equals(new FileNameExtensionFilter(ex.getNombre(), ex.getClave())) ){
				fileChooser.addChoosableFileFilter(new FileNameExtensionFilter(ex.getNombre(), ex.getClave()));
			}
		}	
		
		JButton btnSeleccionarDirectorio = new JButton("Seleccionar Directorio");
		btnSeleccionarDirectorio.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				documentos.clear();
				fileChooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
				int res = fileChooser.showOpenDialog(contentPane);
				if(res == JFileChooser.APPROVE_OPTION){
					File file =fileChooser.getSelectedFile();
					txtDirecc.setText( file.getAbsolutePath() );
					comprobarDiretorio(file);					
					lblArchivosSeleccionados.setText("Archivos Seleccionados: "+ documentos.size());
				}
			}

			private void comprobarDiretorio(File file) {
				Extension[] arrayExt1  = null;
				arrayExt1 = gestor.getExtensionesSelecc();
				if(file.isDirectory()){
					File[] arrayFiles = file.listFiles();
					for(int i = 0; i<arrayFiles.length;i++){
						comprobarDiretorio(arrayFiles[i]);
					}
				}else{
					Pattern patron = Pattern.compile("\\.+");
					String []tokens = patron.split(file.getName());
					String extension = tokens[tokens.length-1];
					for(int i =0; i < arrayExt1.length; i++){
						if(extension.compareTo(arrayExt1[i].getClave()) ==0){
							documentos.add(file);
						}
					}
				}
			}
		});
		
		JButton btnSeleccionarArchivo = new JButton("Seleccionar Archivo");
		btnSeleccionarArchivo.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				Extension[] arrayExt1  = null;
				arrayExt1 = gestor.getExtensionesSelecc();
				documentos.clear();
				fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
				int res = fileChooser.showOpenDialog(contentPane);
				if(res == JFileChooser.APPROVE_OPTION){
					File file = fileChooser.getSelectedFile();
					boolean flag = false;
					Pattern patron = Pattern.compile("\\.+");
					String []tokens = patron.split(file.getName());
					String extension = tokens[tokens.length-1];
					for(int i =0; i < arrayExt1.length; i++){						
						if(extension.compareTo(arrayExt1[i].getClave()) ==0){
							flag = true;
						}
					}
						if(flag){
							documentos.add(file);
							lblArchivosSeleccionados.setText("Archivos Seleccionados: 1");
						}else{
							JOptionPane.showMessageDialog(contentPane, "El Documento elegido no posee una Extension soportada por el Sistema.", "Error", JOptionPane.ERROR_MESSAGE);
						}
						txtDirecc.setText( file.getAbsolutePath() );					
				}
			}
		});
		
		GroupLayout gl_panelMedio = new GroupLayout(panelMedio);
		gl_panelMedio.setHorizontalGroup(
			gl_panelMedio.createParallelGroup(Alignment.LEADING)
				.addGroup(gl_panelMedio.createSequentialGroup()
					.addGroup(gl_panelMedio.createParallelGroup(Alignment.LEADING)
						.addGroup(Alignment.TRAILING, gl_panelMedio.createSequentialGroup()
							.addContainerGap(122, Short.MAX_VALUE)
							.addComponent(btnSeleccionarDirectorio, GroupLayout.PREFERRED_SIZE, 143, GroupLayout.PREFERRED_SIZE)
							.addPreferredGap(ComponentPlacement.RELATED)
							.addComponent(btnSeleccionarArchivo))
						.addGroup(gl_panelMedio.createSequentialGroup()
							.addGap(6)
							.addGroup(gl_panelMedio.createParallelGroup(Alignment.LEADING)
								.addComponent(lblArchivosSeleccionados)
								.addComponent(txtDirecc, GroupLayout.DEFAULT_SIZE, 408, Short.MAX_VALUE))))
					.addContainerGap())
		);
		gl_panelMedio.setVerticalGroup(
			gl_panelMedio.createParallelGroup(Alignment.LEADING)
				.addGroup(gl_panelMedio.createSequentialGroup()
					.addGap(64)
					.addComponent(txtDirecc, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
					.addPreferredGap(ComponentPlacement.RELATED)
					.addComponent(lblArchivosSeleccionados)
					.addGap(14)
					.addGroup(gl_panelMedio.createParallelGroup(Alignment.BASELINE)
						.addComponent(btnSeleccionarArchivo)
						.addComponent(btnSeleccionarDirectorio, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
					.addGap(52))
		);
		gl_panelMedio.linkSize(SwingConstants.HORIZONTAL, new Component[] {btnSeleccionarDirectorio, btnSeleccionarArchivo});
		panelMedio.setLayout(gl_panelMedio);
		
		JPanel panelInferior = new JPanel();
		contentPane.add(panelInferior, BorderLayout.SOUTH);
		
		JButton btnCancelar = new JButton("Cancelar");
		btnCancelar.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				dispose();
			}
		});
		
		JButton btnAtras = new JButton("<<");
		btnAtras.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				try {
					FrameExtensiones frame = new FrameExtensiones( gestor );
					frame.setLocationRelativeTo(null);
					frame.setVisible(true);
					dispose();
				} catch (Exception e1) {
					e1.printStackTrace();
				}
			}
		});
		
		JButton btnSig = new JButton(">>");
		btnSig.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				try {
					if(documentos.size() > 0){
						gestor.setFiles(documentos);
						FrameProcesamiento frame = new FrameProcesamiento( gestor );
						frame.setLocationRelativeTo(null);
						frame.setVisible(true);
						dispose();
					}else{
						JOptionPane.showMessageDialog(contentPane, "Debe Seleccionar al menos un Documento", "Error", JOptionPane.ERROR_MESSAGE);
					}
				} catch (Exception e1) {
					e1.printStackTrace();
				}
			}
		});
		GroupLayout gl_panelInferior = new GroupLayout(panelInferior);
		gl_panelInferior.setHorizontalGroup(
			gl_panelInferior.createParallelGroup(Alignment.LEADING)
				.addGroup(Alignment.TRAILING, gl_panelInferior.createSequentialGroup()
					.addContainerGap(179, Short.MAX_VALUE)
					.addComponent(btnCancelar)
					.addGap(5)
					.addComponent(btnAtras)
					.addGap(5)
					.addComponent(btnSig)
					.addContainerGap())
		);
		gl_panelInferior.setVerticalGroup(
			gl_panelInferior.createParallelGroup(Alignment.LEADING)
				.addGroup(gl_panelInferior.createSequentialGroup()
					.addContainerGap()
					.addGroup(gl_panelInferior.createParallelGroup(Alignment.LEADING)
						.addComponent(btnCancelar)
						.addComponent(btnAtras)
						.addComponent(btnSig))
					.addContainerGap(GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
		);
		gl_panelInferior.linkSize(SwingConstants.VERTICAL, new Component[] {btnCancelar, btnAtras, btnSig});
		gl_panelInferior.linkSize(SwingConstants.HORIZONTAL, new Component[] {btnCancelar, btnAtras, btnSig});
		panelInferior.setLayout(gl_panelInferior);
		
		JLabel lblSeleccion = new JLabel("Seleccione el/los documento/s a cargar:");
		contentPane.add(lblSeleccion, BorderLayout.NORTH);
	}
}
